package com.cmcc.xdr.message;

import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.util.Date;

import com.cmcc.xdr.util.BufferLoadUtil;
import com.cmcc.xdr.util.JudgeBytes;

public class SingleSigMsg {
	public SingleSigGlobalMsg SSGMsg = new SingleSigGlobalMsg();
	public ByteBuffer buffer = null;

	public SingleSigGlobalMsg getSSGMsg() {
		return SSGMsg;
	}

	public void setSSGMsg(SingleSigGlobalMsg sSGMsg) {
		SSGMsg = sSGMsg;
	}

	public ByteBuffer getBuffer() {
		return buffer;
	}

	public void setBuffer(ByteBuffer buffer) {
		this.buffer = buffer;
	}

	/**
	 * 从buff中读取指定长度的数据,buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public byte[] loadByte(int length) {
		return BufferLoadUtil.loadByte(buffer, length);
	}

	/**
	 * @comment 从buff中读取指定长度的数据被将其转换为ip地址。ipv4仅占用四个字节所以将多余的截去。
	 * 
	 * @param length
	 * @return
	 */
	public String loadIp(int length) {
		return BufferLoadUtil.loadIp(buffer, length);
	}

	/**
	 * 从buff中读取指定长度的数据并转换为BigInteger
	 * 
	 * @param length
	 * @return
	 */
	private BigInteger loadBigInteger(int length) {
		return BufferLoadUtil.loadBigInteger(buffer, length);
	}

	
	/**
	 * 从buff中读取指定长度的数据并转换为long buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public long loadLong(int length) {
		return BufferLoadUtil.loadLong(buffer, length);

	}

	/**
	 * 从buff中读取指定长度的数据并转换为int buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public int loadInt(int length) {
		return BufferLoadUtil.loadInt(buffer, length);
	}
	
	/**
	 * 从buff中读取指定长度的数据并转换为int buffer的pos会改变所以需要按顺序读取
	 * 读取SequenceId 专用
	 * @param length
	 * @return
	 */
	public int loadSequenceId(int length) {
		return BufferLoadUtil.loadSequenceId(buffer, length);
	}
	
	/**
	 * 从buff中读取指定长度的数据并转换为int buffer的pos会改变所以需要按顺序读取,返回的是字符串
	 * 
	 * @param length
	 * @return
	 */
	public String loadStrInt(int length) {
		return BufferLoadUtil.loadStrInt(buffer, length);
	}
	
	public String loadStrLong(int length) {
		return BufferLoadUtil.loadStrLong(buffer, length);

	}
	
	public String loadStrLongstr(int length) {//数据库里存的是int
		return BufferLoadUtil.loadStrLongstr(buffer, length);

	}
	
	/**
	 * 从buff中读取指定长度的数据并转换为int buffer的pos会改变所以需要按顺序读取，如果参数带有0，默认值则返回-1
	 * 
	 * @param length
	 * @return
	 */
	public int loadInt2(int length) {
		return BufferLoadUtil.loadInt2(buffer, length);
	}

	/**
	 * 从buff中读取指定长度的数据并转换为string buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public String loadStr(int length) {
		return BufferLoadUtil.loadStr(buffer, length);

	}

	 /**
	  * 从一个byte[]数组中截取一部分
	  * @param src
	  * @param begin
	  * @param count
	  * @return
	  */
	 public static byte[] subBytes(byte[] src, int begin, int count) {
		 return BufferLoadUtil.subBytes(src, begin, count);
	 }
	

	/**
	 * 从buff中读取指定长度的数据并转换为16进制Hash str, buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public String loadHexStr(int length) {
		return BufferLoadUtil.loadHexStr(buffer,length);
	}
	
	/**
	 * 根据byte数据并转换为16进制Hash str
	 * 
	 * @param length
	 * @return
	 */
	public String loadHexStrByByte(byte[] byteData) {
		return BufferLoadUtil.loadHexStrByByte(byteData);
	}


	// TODO load(data,length)系方法存在参数传递问题
	// Note that java.lang.Integer is immutable.
	// try using org.apache.commons.lang.mutable.MutableInt from Apache Commons
	// library.

	/**
	 * 从buff中读取指定长度的数据,buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public byte[] load(byte[] data, int length) {
		data = loadByte(length);
		return data;
	}

	/**
	 * 从buff中读取指定长度的数据并转换为long.buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public Long load(Long data, int length) {
		data = loadBigInteger(length).longValue();
		return data;
	}

	/**
	 * 从buff中读取指定长度的数据并转换为Date.buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public Date load(Date data, int length) {
		long milliseconds = loadBigInteger(length).longValue();
		data = new Date(milliseconds);
		return data;
	}

	/**
	 * 从buff中读取指定长度的数据并转换为int.buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public int load(Integer data, int length) {
		data = loadBigInteger(length).intValue();
		return data;
	}
	
	/**
	 * 将byte解析为int
	 * 原 load方法经过byte直接解析成数字int
	 * @param length
	 * @return
	 */
	public int loadIntByByte(Integer data, byte[] byteData) {
		return BufferLoadUtil.loadIntByByte(data,byteData);
	}

	/**
	 * 从buff中读取指定长度的数据并转换为string buffer的pos会改变所以需要按顺序读取
	 * 
	 * @param length
	 * @return
	 */
	public String load(String data, int length) {
		data = new String(loadByte(length));
		return data;

	}

	public Double load(Double data, int length) {
		byte[] temp = loadByte(length);
		data = JudgeBytes.toDouble(temp);
		return data;
	}

}